#include "parser.h"
#include <cctype>

//constructor de la clase
parser::parser(  ) {
	this->archivosProcesar=("");
}

//destructor
parser::~parser(){
	//por ahora no hay nada que limpiar
}
//

//obtiene los documentos del directorio seteado en globals.h
void parser::obtenerDocumentos(){
    string archivos=("");
	string path = directorioTxt;
	DIR *directorio = opendir(path.c_str());
	if(directorio != NULL){
		struct dirent *pent = NULL;
        
        while ((pent=readdir(directorio))){
           if(strcmp(pent->d_name,"..")!=0 && strcmp(pent->d_name,".")!=0 ){
           	archivos.append("|");
            archivos.append(pent->d_name);
          }
        }
    }
   this->archivosProcesar = archivos;
}

//quito caracteres utf8 como la enie,acentos
string parser::procesarUTF8(string palabra){
	string::size_type loc;
    string buffer;
	
	for(int i=0;i<(sizeof(simbolosUTF8));++i){
	   loc = palabra.find(simbolosUTF8[i], 0 );
	   while(loc != string::npos){
	   	 if( loc != string::npos ) {
	   		palabra = palabra.replace(loc-1,2,reemplazoSimbolosUTF8[i]);
         }
         loc = palabra.find(simbolosUTF8[i], 0 );
      }
	}
	
	// me quedo solo con los numeros y letras
   for(int i=0;i<palabra.length();i++){
   		if(isdigit(palabra[i]) || isalpha(palabra[i])){
   			buffer+=palabra[i] ;
  		}
  	}
     palabra=buffer;
	
	
	return palabra;
}

//quito los caracteres no relevantes como -,* , . y demas.
string parser::quitarCaracteresEspeciales(string palabra){
   string::size_type loc;
     
   //primero verifico que la palabra no sea uno de los simbolos
   for(int i=0;i< (sizeof(simbolos)/4);++i){
   		if(strcmp(simbolos[i].c_str(),palabra.c_str())==0){
   			 return "";
   	    }
  	}
  
    //si la palabra no es ninguno de los simbolos, busco el simbolo en la palabra y lo reemplazo
   for(int i=0;i< (sizeof(simbolos)/4);++i){
	   loc = palabra.find(simbolos[i].c_str(), 0 );
	   while(loc != string::npos){
	   	 if( loc != string::npos ) {
	   		palabra = palabra.replace(loc,1," ");
         }
         loc = palabra.find(simbolos[i].c_str(), 0 );
      }
    }
    
   return palabra;	
}

//procesa el texto original y crea un archivo txt procesado para su mejor lectura mas tarde
//ademas quita enies,acentos y pasa todo a minuscula para su mejor procesamiento.
void parser::procesarDocumentoOriginal(string nombreArchivo){
	FILE* archivoProcesado = NULL;
	string archivoProcesadoConPath =  directorioTxtProcesados + '/' + nombreArchivo + ".txt";
	archivoProcesado = fopen(archivoProcesadoConPath.c_str(),"w+");
	string archivoConPath = directorioTxt + '/' + nombreArchivo + ".txt";
	FILE* archivoOriginal = fopen(archivoConPath.c_str(),"r+");
	
	if(archivoProcesado && archivoOriginal){
			int c;
			char palabra[400];
			string word;
			memset(palabra,0,sizeof(palabra));
			
			while( (c = fscanf(archivoOriginal,"%s",palabra)) != EOF ){
				//reduzco la palabra a minusculas
				word=palabra;
			 
			    std::transform(word.begin(), word.end(), word.begin(),(int(*)(int)) std::tolower);
				
				//quito los caracteres no relevantes como -,* , . y demas.
				word = quitarCaracteresEspeciales(word);
				
				//quito caracteres utf8 como la enie,acentos y demas
				if(!word.empty()){
					word = procesarUTF8(word);
				}

				//escribo la palabra en el archivo.				
				if(!word.empty() && word.length()>1){
					if(word.length()>TAMANIO_MAX_PALABRA){
						word = word.substr(0,TAMANIO_MAX_PALABRA);
					}
					fprintf(archivoProcesado,"%s ",word.c_str());
				}
				//printf("%s  ", word.c_str());
				//limpio todo para evitar problemas de asignacion
				memset(palabra,0,sizeof(palabra));
			}
	}
	fclose(archivoOriginal);
	fclose(archivoProcesado);
	
}

//verifica si el directorio contiene archivos nuevos.
bool parser::verificarDirectorio(){
	string path = directorioTxt;
	DIR *directorio = opendir(path.c_str());
	if(directorio != NULL){
		struct dirent *pent = NULL;
        bool hayArchivos = false; 
        while ((pent=readdir(directorio))){
           if(strcmp(pent->d_name,"..")!=0 && strcmp(pent->d_name,".")!=0 ){
          	hayArchivos = true;
          	break;
          }
        }
        return hayArchivos;
    }
    else{
    	return false;
   	}
}



